11.05.2020

https://leetcode.com/problems/search-in-rotated-sorted-array/submissions/

How to solve

Complexity Analysis

Time: O(log N)

Binary search will find the minimum element in at most log N iterations, since it halves the search space every iteration.

Space: O(1)

We use two local variables to keep track of the lower and upper bound of the binary search.

Solutions

Python

def search(self, nums: List[int], target: int) -> int:
    if not nums:
        return -1

    lo = 0
    hi = len(nums) - 1

    while lo <= hi:
        mid = lo + (hi - lo) // 2
        if nums[mid] == target:
            return mid
        elif nums[lo] <= nums[mid]:
            if nums[lo] <= target < nums[mid]:
                hi = mid - 1
            else:
                lo = mid + 1
        elif nums[mid] <= nums[hi]:
            if nums[mid] < target <= nums[hi]:
                lo = mid + 1
            else:
                hi = mid - 1

    return -1

Go

func search(nums []int, target int) int {
    if nums == nil {
        return -1
    }

    var lo int = 0
    var hi int = len(nums) - 1

    for lo <= hi {
        var mid int = lo + (hi - lo) / 2
        if nums[mid] == target {
            return mid
        } else if nums[lo] <= nums[mid] {
            if nums[lo] <= target && target < nums[mid] {
                hi = mid - 1
            } else {
                lo = mid + 1
            }
        } else if nums[mid] <= nums[hi] {
            if nums[mid] < target && target <= nums[hi] {
                lo = mid + 1
            } else {
                hi = mid - 1
            }
        }
    }
    return -1
}

Rust

use std::usize::MAX;

impl Solution {
    pub fn search(nums: Vec<i32>, target: i32) -> i32 {
        if nums.len() == 0 {
            return -1;
        }

        let mut lo = 0;
        let mut hi = nums.len() - 1;

        while hi != MAX && lo <= hi {
            let mid = lo + (hi - lo) / 2;
            if nums[mid] == target {
                return mid as i32;
            }
            else if nums[lo] <= nums[mid] {
                if nums[lo] <= target && target < nums[mid] {
                    hi = mid - 1;
                } else {
                    lo = mid + 1;
                }
            }
            else if nums[mid] <= nums[hi] {
                if nums[mid] < target && target <= nums[hi] {
                    lo = mid + 1;
                } else {
                    hi = mid - 1;
                }
            }
        }
        -1
    }
}